package org.limewire.inject;
import java.util.Map;
import java.util.logging.Logger;
import com.google.inject.Binder;
import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.google.inject.Scope;
import com.google.inject.Stage;
public class Modules {
private Modules() {}
/**
* Returns a module that returns all providers from the parent module.
*/
public static Module providersFrom(final Injector parent) {
return new Module() {
@SuppressWarnings("unchecked")
public void configure(Binder binder) {
// These types cannot be rebound.
Key loggerKey = Key.get(Logger.class);
Key injectorKey = Key.get(Injector.class);
Key stageKey = Key.get(Stage.class);
for(Map.Entry<Key<?>, Binding<?>> entry : parent.getAllBindings().entrySet()) {
Key key = entry.getKey();
Binding<?> binding = entry.getValue();
Scope scope = MoreScopes.getLinkedScope(binding);
if(!key.equals(loggerKey) && !key.equals(injectorKey) && !key.equals(stageKey) && !key.getTypeLiteral().getRawType().equals(Provider.class)) {
binder.bind(key).toProvider(binding.getProvider()).in(scope) ;
}
}
}
};
}
}